import java.util.ArrayList;
import java.util.List;


public class 观察者模式 {
    public static void main(String[] args) {
        //主题
        NewsAgency newsAgency = new NewsAgency();
        ///定义观察者
        Observer user1 = new Subscriber("用户1");
        Observer user2 = new Subscriber("用户2");
        Observer user3 = new Subscriber("用户3");
        //注册
        newsAgency.registerObserver(user1);
        newsAgency.registerObserver(user2);
        newsAgency.registerObserver(user3);
        newsAgency.removeObserver(user3);
        //发送新闻
        newsAgency.setNews("新闻来了");
        newsAgency.setNews("明天有大事发生！");

    }

}
/// 观察者（Observer） 依赖主题并接收通知。
interface Observer {
    // 当主题通知时，观察者会调用此方法接收更新
    public void update(String message);
}
// 主题接口
	//- 主题（Subject）： 被观察的对象，维护观察者列表并负责通知。
interface Subject {
    // 注册观察者
    void registerObserver(Observer o);
    //移除
    void removeObserver(Observer o);
    //通知
    void notifyObservers();
}
///具体主题
// 具体主题
class NewsAgency implements Subject {

    private  List<Observer> observers = new ArrayList<>();
    private String news;
    public void setNews(String news)
    {
        this.news = news;
        //通知所有观察者
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o); // 添加观察者到列表
    }

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o); // 从列表中移除观察者
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(news);
        }

    }
}
//观察者
class Subscriber implements Observer{
    // 观察者名称
    private String name;

    public Subscriber(String name) {
        this.name = name; // 初始化观察者名称
    }

    @Override
    public void update(String message) {
        // 收到主题的通知时，执行更新操作
        System.out.println(name + " 收到消息: " + message);
    }
}